package dataStructures;

import java.net.InetAddress;
import java.util.ArrayList;

import router.Interface;

import events.EventManager;

/**
 * In dieser Klasse werden alle Nachbarn des Routers gespeichert. Singleton.
 * @author pascal
 *
 */
public class NeighborTable {
	
	
	private static NeighborTable instance = null;
	
	private NeighborTable(){
		data = new ArrayList<NeighborDataStructure>();
	}
	
	public static NeighborTable getInstance(){
		if(instance==null){
			instance = new NeighborTable();
		}
		return instance;
	}
	
	
	private ArrayList<NeighborDataStructure> data;
	
	/**
	 * Prüft ob für den entsprechenden Nachbarn bereits ein Eintrag existiert.
	 * @param neighbor der Nachbar desen Vorhandensein geprüft werden soll
	 * @return 
	 */
	public boolean hasEntry(NeighborDataStructure neighbor){
		if(getEntryForNeighbor(neighbor.getNeighborID()).isEmpty() && getEntryForInterface(neighbor.getAttachedInterface().getInterfaceID()).isEmpty()){
			return false;
		}
		else return true;
	}
	
	/**
	 * Fügt einen Nachbar der Nachbarschaftstabelle hinzu.
	 * @param neighbor
	 */
	public void addEntry(NeighborDataStructure neighbor){
		if(getEntryForInterface(neighbor.getAttachedInterface().getInterfaceID()).isEmpty()){
			data.add(neighbor);
		}
	}
	
	/**
	 * Gibt alle Nachbarn zurück, die von einem bestimmten Router-Interface erkannt wurden.
	 * @param interfaceID
	 * @return Liste aller Nachbarn des Router-Interaces. 
	 */
	public ArrayList<NeighborDataStructure> getEntryForInterface(InetAddress interfaceID){
		
		ArrayList<NeighborDataStructure> returnArray = new ArrayList<NeighborDataStructure>();
		for (NeighborDataStructure neighbor : data) {
			
			if(neighbor.getAttachedInterface().equals(interfaceID)){
				returnArray.add(neighbor);
			}
			
		}
		return returnArray;
	}
	
	/**
	 * Gibt alle Nachbarn zurück, die die selbe ID haben aber von verschiedenen Router-Interfaces erkannt wurden.
	 * @param neighborID
	 * @return
	 */
	public ArrayList<NeighborDataStructure> getEntryForNeighbor(InetAddress neighborID){
		ArrayList<NeighborDataStructure> returnArray = new ArrayList<NeighborDataStructure>();
		
		for (NeighborDataStructure neighbor : data) {
			
			if(neighbor.getNeighborID().equals(neighborID)){
				returnArray.add(neighbor);
			}
			
		}
		return returnArray;
	}
	
	
	/**
	 * Gibt einen bestimmten Nachbar zurück.
	 * @param neighborID ID des Nachbarn.
	 * @param attachedInterface Router-Interface
	 * @return
	 */
	public NeighborDataStructure getNeighbor(InetAddress neighborID, Interface attachedInterface){
		
		for(NeighborDataStructure n : data){
			
			if(n.getNeighborID().equals(neighborID) && n.getAttachedInterface().equals(attachedInterface)){
				return n;
			}
			
		}
		
		return null;
		
	}
	
	
	

}
